package br.com.sgpv2.controler;

import java.util.List;
import java.util.Locale;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import br.com.sgpv2.controler.contribuicaoPrevidenciaria.ContribuicaoPrevidenciariaController;
import br.com.sgpv2.entity.contribuicaoprevidenciaria.ContribuicaoPrevidenciaria;
import br.com.sgpv2.entity.impostorenda.ImpostoRenda;
import br.com.sgpv2.entity.indicadoreconomico.IndicadorEconomico;
import br.com.sgpv2.entity.usuario.Usuario;
import br.com.sgpv2.service.contribuicaoprevidenciaria.ContribuicaoPrevidenciariaService;
import br.com.sgpv2.service.entidade.EntidadeService;
import br.com.sgpv2.service.faixacomparativo.FaixaComparativoService;
import br.com.sgpv2.service.impostorenda.ImpostoRendaService;
import br.com.sgpv2.service.indicadoreconomico.IndicadorEconomicoService;
import br.com.sgpv2.service.pessoa.PessoaService;
import br.com.sgpv2.service.usuario.UsuarioService;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {

	private static final String USUARIO_LOGADO = "usuarioLogado";

	@Autowired
	private PessoaService pessoaService;
	@Autowired
	private ContribuicaoPrevidenciariaService contribuicaoPrevidenciariaService;
	@Autowired
	private ImpostoRendaService impostoRendaService;
	@Autowired
	private IndicadorEconomicoService indicadorEconomicoService;
	@Autowired
	private FaixaComparativoService faixaComparativoService;
	@Autowired
	private EntidadeService entidadeService;
	@Autowired
	private UsuarioService usuarioService;

	/**
	 * Home - controller da página inicial do sistema.
	 * 
	 * @throws Exception
	 */
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model, HttpServletRequest request)
			throws Exception {
		String retorno = "home";
		if (request.getSession().getAttribute(USUARIO_LOGADO) != null) {
			model.addAttribute(USUARIO_LOGADO, request.getSession()
					.getAttribute(USUARIO_LOGADO));
		} else {
			model.addAttribute(USUARIO_LOGADO, null);
			model.addAttribute("usuario", new Usuario());
			retorno = "login";
		}

		return retorno;
	}

	/**
	 * P�gina de erro do sistema.
	 */
	@RequestMapping(value = "/login", method = RequestMethod.GET)
	public String paginaLogin(Locale locale, Model model) throws Exception {
		model.addAttribute("usuario", new Usuario());
		return "login";
	}

	/**
	 * P�gina de erro do sistema.
	 */
	@RequestMapping(value = "/logout", method = RequestMethod.GET)
	public String realizarLogout(Model model, HttpServletRequest request) {
		request.getSession().setAttribute(USUARIO_LOGADO, null);
		model.addAttribute(USUARIO_LOGADO, null);
		model.addAttribute("usuario", new Usuario());
		return "login";
	}

	/**
	 * P�gina de erro do sistema.
	 */
	@RequestMapping(value = "/login", method = RequestMethod.POST)
	public String realizarLogin(@ModelAttribute Usuario usuario, Model model,
			BindingResult result, HttpServletRequest request) {
		Usuario usuarioLogado = usuarioService.realizarLogin(usuario);
		if (usuarioLogado != null) {
			request.getSession().setAttribute(USUARIO_LOGADO, usuarioLogado);
			return "home";
		} else {
			request.getSession().setAttribute(USUARIO_LOGADO, null);
			return "erroLogin";
		}
	}

	/**
	 * Cargos e fun��es - controller da página cargos e fun��es.
	 * 
	 * @throws Exception
	 */
	@RequestMapping(value = "/cargos-funcoes", method = RequestMethod.GET)
	public String cargosFuncoes(Locale locale, Model model) throws Exception {
		return "cargos-funcoes";
	}

	/**
	 * Página de contratos - controller da página de contratos.
	 */
	@RequestMapping(value = "/contratos", method = RequestMethod.GET)
	public String contratos(Locale locale, Model model) {
		return "contratos";
	}

	/**
	 * Página de contribuição previdenci�ria - controller da página de
	 * contribuição previdenci�ria.
	 */
	@RequestMapping(value = "/contribuicaoPrevidenciaria", method = RequestMethod.GET)
	public String contribuicaoPrevidenciaria(Locale locale, Model model)
			throws Exception {

		List<ContribuicaoPrevidenciaria> contribuicoes = contribuicaoPrevidenciariaService
				.listar();

		model.addAttribute("contribuicoes", contribuicoes);
		model.addAttribute("meses",
				ContribuicaoPrevidenciariaController.criarListaMeses());
		model.addAttribute("anos",
				ContribuicaoPrevidenciariaController.criarListaAnos());

		return "contribuicaoPrevidenciaria/contribuicoes";
	}

	/**
	 * Página de faixas de comparativo - controller da página faixas de
	 * comparativo.
	 */
	@RequestMapping(value = "/faixaComparativo", method = RequestMethod.GET)
	public String faixasCompartivo(Locale locale, Model model) {
		try {

			model.addAttribute("faixas", faixaComparativoService.listar());

		} catch (Exception e) {
			e.printStackTrace(); // TVG/RHAS - Verificar como v�o ficar as
									// exce��es.
		}

		return "faixaComparativo/faixas";
	}

	/**
	 * Página de imposto de renda - controller da página imposto de renda.
	 */
	@RequestMapping(value = "/impostoRenda", method = RequestMethod.GET)
	public String impostoRenda(Locale locale, Model model) {

		try {
			List<ImpostoRenda> impostos = impostoRendaService.listar();
			model.addAttribute("impostos", impostos);
			model.addAttribute("meses",
					ContribuicaoPrevidenciariaController.criarListaMeses()); // FIXME
																				// TVG
																				// -
																				// Mudar
																				// para
																				// Classe
																				// Utilit�ria.
			model.addAttribute("anos",
					ContribuicaoPrevidenciariaController.criarListaAnos()); // FIXME
																			// TVG
																			// -
																			// Mudar
																			// para
																			// Classe
																			// Utilit�ria.

		} catch (Exception e) {
			// FIXME TVG/RHAS - Criar página de exce��es para administrador.
			e.printStackTrace();
		}

		return "impostoRenda/impostos";
	}

	/**
	 * Página de indicador economico - controller da página indicador economico.
	 */
	@RequestMapping(value = "/indicadores", method = RequestMethod.GET)
	public String indicadorEconomico(Locale locale, Model model) {
		try {
			List<IndicadorEconomico> indicadores = indicadorEconomicoService
					.listar();
			model.addAttribute("indicadores", indicadores);
			model.addAttribute("meses",
					ContribuicaoPrevidenciariaController.criarListaMeses()); // FIXME
																				// TVG
																				// -
																				// Mudar
																				// para
																				// Classe
																				// Utilit�ria.
			model.addAttribute("anos",
					ContribuicaoPrevidenciariaController.criarListaAnos()); // FIXME
																			// TVG
																			// -
																			// Mudar
																			// para
																			// Classe
																			// Utilit�ria.

		} catch (Exception e) {
			// FIXME TVG/RHAS - Criar página de exce��es para administrador.
			e.printStackTrace();
		}
		return "indicadorEconomico/indicadores";
	}

	/**
	 * Página de locais - controller da página locais.
	 */
	@RequestMapping(value = "/locais", method = RequestMethod.GET)
	public String locais(Locale locale, Model model) {
		return "locais";
	}

	/**
	 * Página de organograma - controller da página organograma.
	 */
	@RequestMapping(value = "/organograma", method = RequestMethod.GET)
	public String organograma(Locale locale, Model model) {
		return "organograma";
	}

	/**
	 * Página de parametro verba - controller da página parametro verba.
	 */
	@RequestMapping(value = "/parametroVerba", method = RequestMethod.GET)
	public String parametroVerba(Locale locale, Model model) {
		return "parametroVerba/parametros";
	}

	public PessoaService getPessoaService() {
		return pessoaService;
	}

	public void setPessoaService(PessoaService pessoaService) {
		this.pessoaService = pessoaService;
	}

	public EntidadeService getEntidadeService() {
		return entidadeService;
	}

	public void setEntidadeService(EntidadeService entidadeService) {
		this.entidadeService = entidadeService;
	}

}
